import AttributeUtil from '@/AttributeUtil';
import BaseUtil from '@/BaseUtil';
import BuffUtil from '@/BuffUtil';
import GameCenter from '@/GameCenter';
import UnitDeathEvent from '@/event/UnitDeathEvent';
import UnitCommon from '../Common/UnitCommon';

export default class RegenSystem {
    constructor() {
        BaseUtil.onTimer(1, this.action);
        se.onUnitDeath(RegenSystem.buffClear);
    }
    static buffClear(this: void, d: UnitDeathEvent) {
        let u = GetTriggerUnit();
        BaseUtil.runLater(1, () => {
            if (IsUnitEnemy(u, Player(0)) || !IsHeroUnitId(GetUnitTypeId(u))) BuffUtil.clearUnitBuffs(u);
            if (IsHeroUnitId(GetUnitTypeId(u))) BuffUtil.clearUnitBuffs(u, true);
            u = null;
        });
    }
    action() {
        let all = GameCenter.getAllUnits();
        for (let u of all) {
            RegenSystem.regenLoop(u);
        }
        return true;
    }
    static regenLoop(u: unit) {
        if (!IsUnitAliveBJ(u)) return;
        let 属性 = AttributeUtil.getUnitAttribute(u);
        let 生命恢复增强 = 属性?.生命恢复增强 ?? 0;
        let 法力恢复增强 = 属性?.法力恢复增强 ?? 0;
        // 体质
        let 生命恢复 = UnitCommon.取生命回复(u);
        let 法力恢复 = UnitCommon.取法力回复(u);

        let 生命 = 生命恢复 * (1 + 生命恢复增强);
        let 法力 = 法力恢复 * (1 + 法力恢复增强);

        let 当前生命 = GetUnitState(u, UNIT_STATE_LIFE);
        let 当前法力 = GetUnitState(u, UNIT_STATE_MANA);
        SetUnitState(u, UNIT_STATE_LIFE, 当前生命 + 生命);
        SetUnitState(u, UNIT_STATE_MANA, 当前法力 + 法力);
    }
    regenLife(u: unit, val: number) {
        let 属性 = AttributeUtil.getUnitAttribute(u);
        let 生命恢复增强 = 属性?.生命恢复增强 ?? 0;
        let 当前生命 = GetUnitState(u, UNIT_STATE_LIFE);
        val = val * (1 + 生命恢复增强);
        SetUnitState(u, UNIT_STATE_LIFE, 当前生命 + val);
    }
    regenMana(u: unit, val: number) {
        let 属性 = AttributeUtil.getUnitAttribute(u);
        let 法力恢复增强 = 属性?.法力恢复增强 ?? 0;
        let 当前法力 = GetUnitState(u, UNIT_STATE_MANA);
        val = val * (1 + 法力恢复增强);
        SetUnitState(u, UNIT_STATE_MANA, 当前法力 + val);
    }
}
